/*
 * @(#)org.example.netty.buf 2020/4/2/0002
 *
 * Copy Right@ 人人译视界
 */


package org.example.netty.buf;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.util.CharsetUtil;

import java.nio.charset.Charset;

/**
 * <pre>
 * @author tuwei
 *
 * @version 0.9
 *
 * 修改版本: 0.9
 * 修改日期: 2020/4/2/0002
 * 修改人 :  tuwei
 * 修改说明: 初步完成
 * 复审人 ：
 * </pre>
 */
public class NettyByteBuf {
	public static void main(String[] args) {
		test1();
		test2();
	}

	private static void test1() {
		// 创建一个对象，包含一个数组array(byte[])，在netty的buffer中不需要flip()操作
		// 因为底层维护了一个readerIndex和writerIndex
		// 通过 readerindex 和  writerIndex 和  capacity， 将buffer分成三个区域
		// 0---readerindex 已经读取的区域
		// readerindex---writerIndex ， 可读的区域
		// writerIndex -- capacity, 可写的区域
		ByteBuf buffer = Unpooled.buffer(10);
		for (int i = 0; i < 10; i++){
			// ByteBuf中的writerIndex会逐渐增加到10
			buffer.writeByte(i);
		}
		System.out.println("capacity=" + buffer.capacity());
		for (int i = 0; i <buffer.capacity(); i++) {
			// readerIndex会从0逐渐增加到writerIndex的值的大小
			System.out.println(buffer.readByte());
		}
	}

	private static void test2() {
		ByteBuf buffer = Unpooled.copiedBuffer("hello world", CharsetUtil.UTF_8);
		if (buffer.hasArray()) {
			byte[] content = buffer.array();
			System.out.println(new String(content, Charset.forName("utf-8")));
			System.out.println("bytebuf=" + buffer);
			System.out.println(buffer.arrayOffset());
			System.out.println(buffer.readerIndex());
			System.out.println(buffer.writerIndex());
			System.out.println(buffer.capacity());
			buffer.readByte();
			// 返回可读字节数，且如果在调此方法之前调用了readByte()则可读字节数会减去对应的读取字节
			// 如果调用getByte(i)则不会导致readableBytes()可读字节数减少
			System.out.println(buffer.readableBytes());
		}
	}
}
